package q930_numSubarraysWithSum;

public class Solution_2 {
    /*
    滑动窗口就比较好理解了
    sum1 代表 从l1 到 r的窗口的和 sum2 则是l2到r
    我们可以使用两个左端点 l1 和 l2，代表在给定右端点 r 的前提下满足要求的左端点集合，
    同时使用 s1 和 s2 分别代表两个端点到 r 这一段的和。
     */
    public int numSubarraysWithSum(int[] nums, int goal) {
        int n = nums.length;
        int left1 = 0, left2 = 0, right = 0;
        int sum1 = 0, sum2 = 0;
        int ret = 0;
        while (right < n) {
            sum1 += nums[right];
            while (left1 <= right && sum1 > goal) {
                sum1 -= nums[left1];
                left1++;
            }
            sum2 += nums[right];
            while (left2 <= right && sum2 >= goal) {
                sum2 -= nums[left2];
                left2++;
            }
            ret += left2 - left1;
            right++;
        }
        return ret;
    }

}
